From 7549a83115de456a9ec72aceef034f0774561611 Mon Sep 17 00:00:00 2001 From: parkrrrr Date: Fri, 7 Apr 2006 14:41:26 +0000 Subject: [PATCH] Added helper functions, moved course calc from garmin_txt --- gpsbabel/grtcirc.c | 21 ++++++++++++++++++++- gpsbabel/grtcirc.h | 7 ++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/gpsbabel/grtcirc.c b/gpsbabel/grtcirc.c index 0a686bfc6..d2cd3a7fc 100644 --- a/gpsbabel/grtcirc.c +++ b/gpsbabel/grtcirc.c @@ -22,6 +22,8 @@ #include #include "defs.h" +static const double EARTH_RAD = 6378137.0; + static void crossproduct( double x1, double y1, double z1, double x2, double y2, double z2, double *xa, double *ya, double *za ) { @@ -47,10 +49,14 @@ static double dotproduct( double x1, double y1, double z1, */ double radtomiles( double rads ) { - const double radmiles = 6378137.0*100.0/2.54/12.0/5280.0; + const double radmiles = EARTH_RAD*100.0/2.54/12.0/5280.0; return (rads*radmiles); } +double radtometers( double rads ) { + return ( rads * EARTH_RAD ); +} + double gcdist( double lat1, double lon1, double lat2, double lon2 ) { double res; res = acos(sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lon1-lon2)); @@ -60,6 +66,19 @@ double gcdist( double lat1, double lon1, double lat2, double lon2 ) { } return res; } + +/* This value is the heading you'd leave point 1 at to arrive at point 2. */ +double heading( double lat1, double lon1, double lat2, double lon2 ) { + double v1, v2; + v1 = sin(lon1 - lon2) * cos(lat2); + v2 = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(lon1 - lon2); + /* rounding error protection */ + if (fabs(v1) < 1e-15) v1 = 0.0; + if (fabs(v2) < 1e-15) v2 = 0.0; + return atan2(v1, v2); +} + + double linedist(double lat1, double lon1, double lat2, double lon2, diff --git a/gpsbabel/grtcirc.h b/gpsbabel/grtcirc.h index ddd37401b..1fb749e40 100644 --- a/gpsbabel/grtcirc.h +++ b/gpsbabel/grtcirc.h @@ -19,15 +19,20 @@ */ double gcdist( double lat1, double lon1, double lat2, double lon2 ); +double heading( double lat1, double lon1, double lat2, double lon2 ); double linedist(double lat1, double lon1, double lat2, double lon2, double lat3, double lon3 ); +double radtometers( double rads ); double radtomiles( double rads ); void linepart(double lat1, double lon1, double lat2, double lon2, double frac, double *reslat, double *reslon ); - + + +#define DEG(x) ((x)*180.0/M_PI) +#define RAD(x) ((x)*M_PI/180.0) -- 2.30.2